home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / sendmail / sendmail-5.65c+IDA-1.4.4.1 / aux / newaliases.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-05  |  4.8 KB  |  227 lines

  1. /*
  2.  * Copyright (c) 1983 Eric P. Allman
  3.  * Copyright (c) 1988 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms are permitted provided
  7.  * that: (1) source distributions retain this entire copyright notice and
  8.  * comment, and (2) distributions including binaries display the following
  9.  * acknowledgement:  ``This product includes software developed by the
  10.  * University of California, Berkeley and its contributors'' in the
  11.  * documentation or other materials provided with the distribution and in
  12.  * all advertising materials mentioning features or use of this software.
  13.  * Neither the name of the University nor the names of its contributors may
  14.  * be used to endorse or promote products derived from this software without
  15.  * specific prior written permission.
  16.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  17.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  18.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  19.  */
  20.  
  21. #ifndef lint
  22. char copyright[] =
  23. "@(#) Copyright (c) 1988 Regents of the University of California.\n\
  24.  All rights reserved.\n";
  25. #endif /* not lint */
  26.  
  27. #ifndef lint
  28. static char sccsid[] = "@(#)newaliases.c    5.4 (Berkeley) 6/1/90";
  29. #endif /* not lint */
  30.  
  31. # include <stdio.h>
  32. # include <ctype.h>
  33. # include "sendmail.h"
  34. # include "pathnames.h"
  35.  
  36. static    char SccsId[] = "@(#)newaliases.c    5.4    6/1/90";
  37.  
  38. typedef struct { char *dptr; int dsize; } datum;
  39. char *aliases = ALIASFILE;
  40. char dirbuf[100];
  41. char pagbuf[100];
  42. int LineNo;
  43. char *To;
  44. int ExitStat;
  45. int Errors;
  46. HDR *Header;
  47. struct mailer *Mailer[MAXMAILERS+1];
  48. int NextMailer = 0;
  49. # ifdef DEBUG
  50. int Debug;
  51. # endif DEBUG
  52.  
  53. main(argc, argv)
  54.     int argc;
  55.     char *argv[];
  56. {
  57.     int f;
  58.     char line[BUFSIZ];
  59.     register char *p;
  60.     char *p2;
  61.     char *rhs;
  62.     int naliases, bytes, longest;
  63.     datum key, content;
  64.     bool skipping;
  65.     ADDRESS al, bl;
  66.     extern char *prescan();
  67.     extern ADDRESS *parse();
  68.     bool contin;
  69.     char *cffile = _PATH_SENDMAILCF;
  70.  
  71. # ifdef DEBUG
  72.     if (argc > 1 && strcmp(argv[1], "-T") == 0)
  73.     {
  74.         Debug = 100;
  75.         argc--;
  76.         argv++;
  77.     }
  78. # endif DEBUG
  79.     if (argc > 1)
  80.         aliases = argv[1];
  81.     if (argc > 2)
  82.         cffile = argv[2];
  83.     readcf(cffile);
  84.  
  85.     (void) strcpy(dirbuf, aliases);
  86.     (void) strcat(dirbuf, ".dir");
  87.     (void) strcpy(pagbuf, aliases);
  88.     (void) strcat(pagbuf, ".pag");
  89.     f = creat(dirbuf, 0666);
  90.     if (f < 0) {
  91.         perror(dirbuf);
  92.         exit(1);
  93.     }
  94.     (void) close(f);
  95.     f = creat(pagbuf, 0666);
  96.     if (f < 0) {
  97.         perror(pagbuf);
  98.         exit(1);
  99.     }
  100.     (void) close(f);
  101.     if (dbminit(aliases) < 0)
  102.         exit(1);
  103.     if (freopen(aliases, "r", stdin) == 0) {
  104.         perror(aliases);
  105.         exit(1);
  106.     }
  107.  
  108.     /* read and interpret lines */
  109.     LineNo = 0;
  110.     naliases = 0;
  111.     bytes = 0;
  112.     longest = 0;
  113.     skipping = FALSE;
  114.     while (fgets(line, sizeof (line), stdin) != NULL)
  115.     {
  116.         LineNo++;
  117.         switch (line[0])
  118.         {
  119.           case '#':
  120.           case '\n':
  121.           case '\0':
  122.             skipping = FALSE;
  123.             continue;
  124.  
  125.           case ' ':
  126.           case '\t':
  127.             if (!skipping)
  128.                 usrerr("Non-continuation line starts with space");
  129.             skipping = TRUE;
  130.             continue;
  131.         }
  132.         skipping = FALSE;
  133.  
  134.         /* process the LHS */
  135.         for (p = line; *p != '\0' && *p != ':' && *p != '\n'; p++)
  136.             continue;
  137.         if (*p == '\0' || *p == '\n')
  138.         {
  139.          syntaxerr:
  140.             usrerr("missing colon");
  141.             continue;
  142.         }
  143.         *p++ = '\0';
  144.         if (parse(line, &al, 1) == NULL)
  145.         {
  146.             *--p = ':';
  147.             goto syntaxerr;
  148.         }
  149.         rhs = p;
  150.         contin = FALSE;
  151.         for (;;)
  152.         {
  153.             register char c;
  154.  
  155.             /* do parsing & compression of addresses */
  156.             c = *p;
  157.             while (c != '\0')
  158.             {
  159.                 p2 = p;
  160.                 while (*p != '\n' && *p != ',' && *p != '\0')
  161.                     p++;
  162.                 c = *p;
  163.                 *p++ = '\0';
  164.                 if (*p2 == '\0')
  165.                 {
  166.                     p[-1] = c;
  167.                     continue;
  168.                 }
  169.                 parse(p2, &bl, -1);
  170.                 contin = (c == ',');
  171.                 p[-1] = c;
  172.                 while (isspace(*p))
  173.                     p++;
  174.             }
  175.  
  176.             /* see if there should be a continuation line */
  177.             if (!contin)
  178.                 break;
  179.  
  180.             /* read continuation line */
  181.             p--;
  182.             if (fgets(p, sizeof line - (p - line), stdin) == NULL)
  183.                 break;
  184.             LineNo++;
  185.  
  186.             if (!isspace(*p))
  187.                 usrerr("continuation line missing");
  188.         }
  189.         if (al.q_mailer != MN_LOCAL)
  190.         {
  191.             usrerr("cannot alias non-local names");
  192.             continue;
  193.         }
  194.         naliases++;
  195.         key.dsize = strlen(al.q_user) + 1;
  196.         key.dptr = al.q_user;
  197.         content.dsize = strlen(rhs) + 1;
  198.         if (content.dsize > longest)
  199.             longest = content.dsize;
  200.         content.dptr = rhs;
  201.         bytes += key.dsize + content.dsize;
  202.         if (store(key, content), 0)
  203.         /* if (f = store(key, content)) */
  204.             usrerr("Dbm internal error return %d from store\n", f);
  205.     }
  206.     fprintf(stderr, "%d aliases, %d bytes, longest %d bytes, %d errors\n",
  207.         naliases, bytes, longest, Errors);
  208.  
  209.     exit(ExitStat);
  210. }
  211.  
  212. usrerr(fmt, a, b, c, d, e)
  213.     char *fmt;
  214. {
  215.     Errors++;
  216.     fprintf(stderr, "line %d: ", LineNo);
  217.     fprintf(stderr, fmt, a, b, c, d, e);
  218.     fprintf(stderr, "\n");
  219.     return (-1);
  220. }
  221.  
  222. syserr(fmt, a, b, c, d, e)
  223.     char *fmt;
  224. {
  225.     return (usrerr(fmt, a, b, c, d, e));
  226. }
  227.